package br.dataconverter.reader;

/*
 help
 http://www.devmedia.com.br/classe-arraylist-e-arquivo-texto-agenda-de-contatos-uma-abordagem-estruturada-em-java/25087
 http://javanoroeste.com.br/javanoroeste/novo/artigos/arquivos.html
 */

import br.dataconverter.reader.DataReader;
import br.dataconverter.util.DataColumn;
import br.dataconverter.util.DataType;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

import javax.sound.sampled.Line;
import javax.xml.crypto.Data;

/*
 help
 http://www.devmedia.com.br/classe-arraylist-e-arquivo-texto-agenda-de-contatos-uma-abordagem-estruturada-em-java/25087
 http://javanoroeste.com.br/javanoroeste/novo/artigos/arquivos.html
 */

/**
 * Esta classe processa arquivos de entrada no formato CSV.
 * 
 * Além dos métodos da interface {@link br.dataconverter.reader.DataReader}
 * implementa alguns métodos específicos a arquivos CSV.
 * 
 * @author Ronen Filho
 * 
 */
public class DataReaderCSV implements DataReader {

	private File file;
	private boolean columnsHeader;
	private String separador = ";";	

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setFile(File file) {
		if (file != null) {
			this.file = file;
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setColumnsHeader(boolean header) {
		/*
		 * Configura se o arquivo possuia primeiro linha como cabeçalho true:
		 * Sim, a primeira linha será considerada como cabeçalho false: Não, a
		 * primeira linha não será considerada como cabeçalho
		 */
		columnsHeader = header;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean isColumnsHeader() {
		/*
		 * Verifica se o arquivo possuia primeiro linha como cabeçalho true:
		 * Sim, a primeira linha será considerada como cabeçalho false: Não, a
		 * primeira linha não será considerada como cabeçalho
		 */
		return columnsHeader;
	}

	/**
	 * Este método permite consultar os nomes das colunas do arquivo de entrada
	 * de dados.
	 * 
	 * @return lista contendo os nomes das colunas do arquivo de entrada de
	 *         dados ou uma lista numerada de 0 a n-1 sendo n o número de
	 *         colunas do arquivo de entrada.
	 * 
	 * @throws IOException
	 *             caso aconteça algum problema na leitura ou acesso ao arquivo.
	 */
	@Override
	public List<String> getColumnsNames() throws IOException {
		/*
		 * Ler o nome da coluna do arquivo Deve ser verificada a configuração
		 * para isColumnHeader Retorno: Deve retornar o nome das colunas
		 */

		List<String> strings = new ArrayList<String>();

		if (isColumnsHeader()) {
			// Ler nome das colunas
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);

			String linha = br.readLine();

			// teste
			//System.out.println(linha);

			// Pega os valores das colunas
			// strings.addAll(Arrays.asList(linha.split("(?<=\\G.{1})")));
			strings.addAll(Arrays.asList(linha.split(separador)));
			
			// teste de impressão dos valores
			/*
			 * for (String cell : strings) System.out.println(cell+" ");
			 */

			// Fecha arquivo para desbloqueio do mesmo
			br.close();
			fr.close();
		} else {
			System.out.println("Não é possível ler o nome da coluna.");
			System.out
					.println("Verifique o parametro de leitura do nome da coluna");
		}
		return strings;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setColumnsFilter(List<String> columnsNames) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setColumnsFilter(int[] columnsIndex) {
		throw new UnsupportedOperationException("Not supported yet.");
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public List<DataColumn> getColumns() throws IOException {
		// public List<String> getColumns() throws IOException {
		/*
		 * Ler o conteúdo da coluna do arquivo Deve ser verificada a
		 * configuração
		 */

		List<DataColumn> dataColumns = new ArrayList<DataColumn>();
		// List<String> dataColumns = new ArrayList<String>();

		// Ler conteúdo das colunas
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);

		String linha;

		int j = 0, i = 0;
		while ((linha = br.readLine()) != null) {
			for (String valor : linha.split(separador)) {
				if (i == 0) {
					DataColumn coluna = new DataColumn();
					coluna.setHeader(valor);
					dataColumns.add(coluna);
				} else {
					dataColumns.get(j).addValue(valor);
					j++;
				}
			}
			j = 0;
			i++;
			// dataColumns.addAll(Arrays.asList(linha.split(separador)));
		}

		br.close();
		fr.close();

		return dataColumns;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setColumnsDataType(List<DataType> dataType) {
		// TODO Auto-generated method stub

	}

	/*
	 * public void lerArquivoSimplesTest() throws FileNotFoundException,
	 * IOException { FileReader fr = new FileReader(file);
	 * 
	 * BufferedReader br = new BufferedReader(fr);
	 * 
	 * // enquanto houver mais linhas while (br.ready()) { // lê a proxima linha
	 * String linha = br.readLine();
	 * 
	 * // faz algo com a linha System.out.println(linha); }
	 * 
	 * br.close(); fr.close(); }
	 */
}
